import request from '@/utils/request/req';

/**
 * 分页参数接口
 */
export interface PageParams {
  current: number; // 当前页码，从1开始
  size: number; // 每页记录数
}

/**
 * AI模型数据结构
 */
export interface AIModel {
  id: number; // 模型ID
  modelName: string; // 所属行业
  aiRoleSetting: string; // AI角色设定
  businessBackground: string; // 企业背景
  dialogueCase: string; // 对话案例
}

/**
 * 话术数据结构
 */
export interface LanguageSkill {
  id: number; // 话术ID
  accountType: string; // 公司标识
  aiModelId: number; // AI投喂训练ID
  issue: string; // 问题
  answer: string; // 回答
  status: string; // 状态（0审核中 1正常 2删除）
  type: string; // 类型（用于switch绑定）
  reviewer?: string; // 审核人
  createBy: string; // 创建人
  createTime: string; // 创建时间
  updateBy?: string; // 修改人
  updateTime?: string; // 修改时间
  excelId?: string; // Excel文件ID
  vectorId?: string; // 向量ID
}

/**
 * 文件信息数据结构
 */
export interface FileInfo {
  id: number; // 文件ID
  fileName: string; // 文件名
  fileSize: string; // 文件大小（字节）
  createBy: string; // 创建人
  createTime: string; // 创建时间
}

/**
 * 组织架构数据结构
 */
export interface Organization {
  id: number; // 部门ID
  departmentName: string; // 部门名称
  parentId: number | null; // 父部门ID，顶级为null
  level: number; // 层级，顶级为0
  accountType: string; // 公司标识
  createTime: string; // 创建时间
  updateTime: string; // 更新时间
  isDelete: string; // 是否删除（0可用 1删除）
  children?: Organization[]; // 子部门列表
}

/**
 * 分页响应数据结构
 */
export interface PageResponse<T> {
  records: T[]; // 数据列表
  total: number; // 总记录数
  size: number; // 每页记录数
  current: number; // 当前页码
  orders: any[]; // 排序信息
  optimizeCountSql: boolean; // 是否优化count查询
  searchCount: boolean; // 是否进行count查询
  maxLimit: number | null; // 最大限制
  countId: string | null; // count查询ID
  pages: number; // 总页数
}

/**
 * 获取AI模型列表
 * @param params 查询参数
 * @param params.current 当前页码，从1开始
 * @param params.size 每页记录数
 * @param params.modelName 模型名称，支持模糊查询
 * @returns 返回分页数据，包含AI模型列表
 */
export const getModelList = (params: PageParams & { modelName?: string }) => {
  return request.get<PageResponse<AIModel>>('/msg/aiModel/list', { params });
};

/**
 * 新增模型
 * @param data AI模型数据
 * @param data.modelName 所属行业
 * @param data.aiRoleSetting AI角色设定
 * @param data.businessBackground 企业背景
 * @param data.dialogueCase 对话案例
 * @returns 返回操作结果
 */
export const addAIModel = (data: Omit<AIModel, 'id'>) => {
  return request.post('/msg/aiModel/add', data);
};

/**
 * 修改模型
 * @param data AI模型数据
 * @param data.id 模型ID
 * @param data.modelName 所属行业
 * @param data.aiRoleSetting AI角色设定
 * @param data.businessBackground 企业背景
 * @param data.dialogueCase 对话案例
 * @returns 返回操作结果
 */
export const updateAIModel = (data: AIModel) => {
  return request.post('/msg/aiModel/update', data);
};

/**
 * 删除模型
 * @param id 模型ID
 * @returns 返回操作结果
 */
export const deleteAIModel = (id: number) => {
  return request.post(`/msg/aiModel/delete/${id}`);
};

/**
 * 获取话术列表
 * @param params 查询参数
 * @param params.current 当前页码，从1开始
 * @param params.size 每页记录数
 * @param params.accountType 公司标识
 * @param params.status 状态（0审核中 1启用 2停用）
 * @param params.issue 问题，支持模糊查询
 * @param params.answer 答案，支持模糊查询
 * @returns 返回分页数据，包含话术列表
 */
export const getAIModelList = (params: PageParams & { accountType?: string; status?: string; issue?: string; answer?: string }) => {
  return request.get<PageResponse<LanguageSkill>>('/msg/aiLanguageSkills/list', { params });
};

/**
 * 新增话术
 * @param data 话术数据
 * @param data.accountType 公司标识
 * @param data.aiModelId AI投喂训练ID
 * @param data.issue 问题
 * @param data.answer 回答
 * @param data.status 状态
 * @param data.reviewer 审核人
 * @param data.createBy 创建人
 * @returns 返回操作结果
 */
export const addLanguageSkill = (data: Omit<LanguageSkill, 'id' | 'createTime' | 'updateTime'>) => {
  return request.post('/msg/aiLanguageSkills/add', data);
};

/**
 * 修改话术
 * @param data 话术数据
 * @param data.id 话术ID
 * @param data.accountType 公司标识
 * @param data.aiModelId AI投喂训练ID
 * @param data.issue 问题
 * @param data.answer 回答
 * @param data.status 状态
 * @param data.type 类型
 * @param data.vectorId 向量ID
 * @param data.updateBy 修改人
 * @returns 返回操作结果
 */
export const updateLanguageSkill = (
  data: Pick<LanguageSkill, 'id' | 'accountType' | 'aiModelId' | 'issue' | 'answer' | 'status' | 'type' | 'vectorId' | 'updateBy'>
) => {
  return request.post('/msg/aiLanguageSkills/update', data);
};

/**
 * 修改话术状态
 * @param data 话术数据（参数和修改话术的一样）
 * @param data.id 话术ID
 * @param data.accountType 公司标识
 * @param data.aiModelId AI投喂训练ID
 * @param data.status 状态
 * @param data.vectorId 向量ID
 * @returns 返回操作结果
 */
export const updateLanguageSkillStatus = (data: Pick<LanguageSkill, 'id' | 'accountType' | 'aiModelId' | 'status' | 'type' | 'vectorId'>) => {
  return request.post('/msg/aiLanguageSkills/updateStatus', data);
};

/**
 * 删除话术
 * @param id 话术ID
 * @returns 返回操作结果
 */
export const deleteLanguageSkill = (id: number) => {
  return request.post(`/msg/aiLanguageSkills/delete/${id}`);
};

/**
 * 获取文件列表
 * @param params 查询参数
 * @param params.current 当前页码，从1开始
 * @param params.size 每页记录数
 * @param params.fileName 文件名，支持模糊查询
 * @returns 返回分页数据，包含文件列表
 */
export const getFileList = (params: PageParams & { fileName?: string }) => {
  return request.get<PageResponse<FileInfo>>('/msg/aiFile/list', { params });
};

/**
 * 上传文件
 * @param data FormData对象
 * @param data.file 上传的文件（Excel格式）
 * @param data.createBy 创建人
 * @returns 返回操作结果
 */
export const uploadFile = (data: FormData) => {
  return request.post('/msg/aiFile/upload', data, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  });
};

/**
 * 删除文件
 * @param id 文件ID
 * @returns 返回操作结果
 */
export const deleteFile = (id: number) => {
  return request.post(`/msg/aiFile/delete/${id}`);
};

/**
 * 上传话术库
 * @param data FormData对象
 * @param data.file 上传的文件
 * @param data.aiModelId 当前导入模型id
 * @param data.accountType 公司标识
 * @param data.createBy 创建人
 * @returns 返回操作结果
 */
export const uploadLanguageSkills = (data: FormData) => {
  return request.post('/msg/aiLanguageSkills/upload', data, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  });
};

/**
 * 导出话术库
 * @param params 查询参数
 * @param params.current 当前页码，从1开始
 * @param params.size 每页记录数
 * @param params.accountType 公司标识
 * @param params.aiModelId AI投喂训练ID
 * @param params.status 状态（0审核中 1正常 2删除）
 * @param params.issue 问题，支持模糊查询
 * @param params.answer 答案，支持模糊查询
 * @returns 返回文件流
 */
export const exportLanguageSkills = (
  params: PageParams & {
    accountType?: string;
    aiModelId?: number;
    status?: string;
    issue?: string;
    answer?: string;
  }
) => {
  return request.post('/msg/aiLanguageSkills/export', params, {});
};

/**
 * 获取AI模板
 * @param params 查询参数
 * @param params.industry 所属行业
 * @returns 返回AI模板数据
 */
export const getAiTemplate = (params: { industry: string }) => {
  return request.get<{
    aiRoleSetting: string;
    businessBackground: string;
    dialogueCase: string;
  }>('/msg/aiModel/getAiTemplate', { params });
};

// ==================== 组织架构相关接口 ====================

/**
 * 获取组织架构树
 * @param params 查询参数
 * @param params.accountType 公司标识
 * @param params.isDelete 是否删除（0可用 1删除）
 * @returns 返回组织架构树数据
 */
export const getOrganizationTree = (params: { accountType: string; isDelete: string }) => {
  return request.get<Organization[]>('/msg/organization/tree', { params });
};

/**
 * 新增组织架构
 * @param data 组织架构数据
 * @param data.departmentName 部门名称
 * @param data.parentId 父部门ID，顶级为null
 * @param data.level 层级，顶级为0
 * @param data.accountType 公司标识
 * @returns 返回操作结果
 */
export const addOrganization = (data: Omit<Organization, 'id' | 'createTime' | 'updateTime' | 'isDelete' | 'children'>) => {
  return request.post('/msg/organization/add', data);
};

/**
 * 修改组织架构
 * @param data 组织架构数据
 * @param data.id 部门ID
 * @param data.departmentName 部门名称
 * @param data.parentId 父部门ID
 * @param data.level 层级
 * @param data.accountType 公司标识
 * @returns 返回操作结果
 */
export const updateOrganization = (data: Omit<Organization, 'createTime' | 'updateTime' | 'isDelete' | 'children'>) => {
  return request.post('/msg/organization/update', data);
};

/**
 * 删除组织架构
 * @param id 部门ID
 * @returns 返回操作结果
 */
export const deleteOrganization = (id: number) => {
  return request.post(`/msg/organization/delete/${id}`);
};
